看到一个很赞的演示,搬运一下地址。
涉及到http超时处理,stream读写大文件,串并行的异步调用等,对node初学者是很好的启发。
以下是搬运了演示里的一些代码:
var http = require('http');
var parse = require('url').parse;
function urlget(url, callback) {
var info = parse(url);
var options = {host: info.hostname, port: info.port || 80, path: info.path, method: 'GET'};
var req = null, request_timeout = null;
request_timeout = setTimeout(function() {
request_timeout = null;
req.abort();
callback(new Error('Request timeout!!'));
}, 2000);
var req = http.request(options, function(res) {
clearTimeout(request_timeout);
var chunks = [], length = 0, response_timeout = null;
response_timeout = setTimeout(function() {
response_timeout = null;
req.abort();
callback(new Error('Response timeout!!'));
}, 2000);
res.on('data', function(chunk) {
length += chunk.length;
chunks.push(chunk);
}).on('end', function() {
if(response_timeout) {
clearTimeout(response_timeout);
var data = Buffer.concat(chunks,length);
res.body = data;
callback(null, res);
}
}).on('error', function(err) {
callback(err, res);
}).on('aborted', function() {
if(response_timeout) {
callback(new Error('Response aborted!!'), res);
}
});
}).on('error', function(err) {
if(request_timeout) {
clearTimeout(request_timeout);
callback(err);
}
});
req.end();
};
//验证请求超时
var timeout_url = 'http://t.co/';
urlget(timeout_url, function(err, res) {
console.log('getting: ', timeout_url);
if(err) {
console.log('error:\n', err, '\nresponse:\n', res ? res.headers : null);
} else {
console.log('headers:\n', res.headers, '\nbody:\n', res.body.toString());
}
});
//正常情况访问
var good_url = 'http://www.baidu.com';
urlget(good_url, function(err, res) {
console.log('getting: ', good_url);
if(err) {
console.log('error:\n', err, '\nresponse:\n', res ? res.headers : null);
} else {
console.log('headers:\n', res.headers, '\nbody:\n', res.body.toString());
}
});
//验证响应超时 自己搭一个服务器
var res_url = 'http://localhost:1984/foo?s=10';
urlget(res_url, function(err, res) {
console.log('getting: ', good_url);
if(err) {
console.log('error:\n', err, '\nresponse:\n', res ? res.headers : null);
} else {
console.log('headers:\n', res.headers, '\nbody:\n', res.body.toString());
}
});
//搭建超时服务器
var http = require('http'), parse = require('url').parse;
http.createServer(function(req, res) {
var info = parse(req.url, true);
var s = +info.query.s;
res.write('Please waitting for ' + s + ' seconds...');
setTimeout(function() {
res.end(s + ' seconds, url: ' + req.url);
}, s * 1000);
}).listen(1984);
console.log('Server http://localhost:1984/');
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。